#ifndef h_convH
#define h_convH

namespace h_base
{

/*
   BIG5HK
         BIG5HK是在BIG5码的基础上，增加了香港增补字符集（Hong Kong
     Supplementary Character Set，缩写HKSCS）而成。
     其编码格式为第一字节[0x81,0xfe]，第二字节[0x40,0x7e]、[0xa1,0xfe]。
     第一字节为[0x81,0xa0]、[0xfa,0xfe]的编码是HKSCS。
     BIG5HK与EBCDIC混合编码的CCSID为937。
   GBK
         GBK是中国大陆地区汉字编码事实上的标准。
     其编码格式为第一字节[0x81,0xfe]，第二字节[0x40,0x7e]、[0x80,0xfe]。
     第一字节[0xa0,0xfe]，第二字节[0xa0,0xfe]是GB2312。
     GBK与EBCDIC混合编码的CCSID为1388。
*/

typedef struct
{
   unsigned int Key;
   unsigned int Start;
   int Qty;
   int Serial;
} HConvertIndex;

typedef struct
{
   unsigned int *Tab;
   HConvertIndex *Idx;
   int IdxSize;
} HConvertInfo;

#define GBK_TO_IBM1388          0
#define IBM1388_TO_GBK          1
#define BIG5HK_TO_IBM937        2
#define IBM937_TO_BIG5HK        3
#define GBK_TO_UTF_8            4
#define UTF_8_TO_GBK            5
#define BIG5HK_TO_UTF_8         6
#define UTF_8_TO_BIG5HK         7
#define UTF_8_TO_UTF_EBCDIC     8
#define UTF_EBCDIC_TO_UTF_8     9

#define CONV_NULL               ((unsigned int)-1)

typedef enum { csNone, csGbk, csBig5, csUtf8 } HCodeSet;

HConvertInfo *GetConvInfo(int Dir);
int NameToDir(const char *Name);
unsigned int ConvertChar(const HConvertInfo *Info,
   unsigned int c);

unsigned char ConvChar(unsigned char c, int Dir);
unsigned int ConvWchar(unsigned int c, int Dir);
int ConvStr(void *Des, const void *Src, int Len, int Dir);
int ConvStr(void *Des, const void *Src, int Dir);
void PrintConvTab(const map<unsigned int, unsigned int> &Map,
   const char *Name);

HCodeSet StrToCodeSet(const HString &CodeSetStr);
HString CodeSetToStr(HCodeSet CodeSet);
void ConvString(HCodeSet From, HCodeSet To, char *Str);

};

#endif
